package org.erp.spu.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.erp.common.page.PageQueryModel;
import org.erp.spu.convert.SpuTemplateInfoConvert;
import org.erp.spu.entity.bo.SpuTemplateInfoBo;
import org.erp.spu.entity.dto.SpuTemplateInfoDto;
import org.erp.spu.entity.vo.SpuTemplateInfoVo;
import org.erp.spu.mapper.SpuTemplateInfoMapper;
import org.erp.spu.service.SpuTemplateInfoService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.erp.spu.entity.SpuTemplateInfo;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class SpuTemplateInfoServiceImpl extends ServiceImpl<SpuTemplateInfoMapper, SpuTemplateInfo> implements SpuTemplateInfoService {

    @Resource
    private SpuTemplateInfoMapper spuTemplateInfoMapper;
    @Resource
    private SpuTemplateInfoConvert spuTemplateInfoConvert;

    /**
     * 获取所有模板信息
     * @param spuTemplateInfoBo
     * @return
     */
    @Override
    public List<SpuTemplateInfoVo> getList(SpuTemplateInfoBo spuTemplateInfoBo) {
        LambdaQueryWrapper<SpuTemplateInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(StringUtils.hasText(spuTemplateInfoBo.getTemplateName()),SpuTemplateInfo::getTemplateName, spuTemplateInfoBo.getTemplateName());
        queryWrapper.eq(spuTemplateInfoBo.getCategoryId()!=null, SpuTemplateInfo::getCategoryId, spuTemplateInfoBo.getCategoryId());
        queryWrapper.eq(SpuTemplateInfo::getDelFlag, 0);
        List<SpuTemplateInfo> templateInfoList=spuTemplateInfoMapper.selectList(queryWrapper);
       return templateInfoList.stream()
                .map(spuTemplateInfo -> spuTemplateInfoConvert.converttoVo(spuTemplateInfo))
                .collect(Collectors.toList());
    }

    /**
     * 分页查询模板信息
     * @param spuTemplateInfoDto 查询参数
     * @return 分页结果
     */
    @Override
    public PageQueryModel<SpuTemplateInfoVo> getListByPage(SpuTemplateInfoDto spuTemplateInfoDto) {
        LambdaQueryWrapper<SpuTemplateInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(StringUtils.hasText(spuTemplateInfoDto.getTemplateName()), SpuTemplateInfo::getTemplateName, spuTemplateInfoDto.getTemplateName());
        queryWrapper.like(StringUtils.hasText(spuTemplateInfoDto.getLabel()), SpuTemplateInfo::getLabel, spuTemplateInfoDto.getLabel());
        queryWrapper.eq(spuTemplateInfoDto.getCategoryId() != null, SpuTemplateInfo::getCategoryId, spuTemplateInfoDto.getCategoryId());
        queryWrapper.like(StringUtils.hasText(spuTemplateInfoDto.getCategoryName()), SpuTemplateInfo::getCategoryName, spuTemplateInfoDto.getCategoryName());
        queryWrapper.eq(spuTemplateInfoDto.getGeneralPurposeFlag() != null, SpuTemplateInfo::getGeneralPurposeFlag, spuTemplateInfoDto.getGeneralPurposeFlag());
        queryWrapper.eq(StringUtils.hasText(spuTemplateInfoDto.getStatus()), SpuTemplateInfo::getStatus, spuTemplateInfoDto.getStatus());
        queryWrapper.eq(SpuTemplateInfo::getDelFlag, 0);
        Page<SpuTemplateInfo> page = this.page(spuTemplateInfoDto.buildPage(), queryWrapper);
        List<SpuTemplateInfoVo> voList = page.getRecords().stream()
                .map(spuTemplateInfoConvert::converttoVo)
                .collect(Collectors.toList());
        return PageQueryModel.of(page.getPages(), voList);
    }

    /**
     * 新增模板信息
     * @param spuTemplateInfoDto 模板信息
     * @return 操作结果
     */
    @Override
    public boolean addSpuTemplateInfo(SpuTemplateInfoDto spuTemplateInfoDto) {
        Assert.isTrue(!checkTemplateName(spuTemplateInfoDto), "模板名称已存在");
        SpuTemplateInfo spuTemplateInfo = new SpuTemplateInfo();
        BeanUtils.copyProperties(spuTemplateInfoDto, spuTemplateInfo);
        return spuTemplateInfoMapper.insert(spuTemplateInfo) > 0;
    }

    /**
     * 修改模板信息
     * @param spuTemplateInfoDto 模板信息
     * @return 操作结果
     */
    @Override
    public boolean updateSpuTemplateInfo(SpuTemplateInfoDto spuTemplateInfoDto) {
        Assert.isTrue(spuTemplateInfoDto.getId() != null, "模板ID不能为空");
        SpuTemplateInfo existing = spuTemplateInfoMapper.selectById(spuTemplateInfoDto.getId());
        Assert.isTrue(existing != null, "模板不存在");
        Assert.isTrue(!checkTemplateName(spuTemplateInfoDto), "模板名称已存在");
        BeanUtils.copyProperties(spuTemplateInfoDto, existing);
        return spuTemplateInfoMapper.updateById(existing) > 0;
    }

    /**
     * 根据ID获取模板详情
     * @param id 模板ID
     * @return 模板详情
     */
    @Override
    public SpuTemplateInfoVo getSpuTemplateInfoVoById(Long id) {
        SpuTemplateInfo entity = spuTemplateInfoMapper.selectById(id);
        if (entity == null) {
            return null;
        }
        return spuTemplateInfoConvert.converttoVo(entity);
    }

    /**
     * 检查模板名称是否已存在
     * @param spuTemplateInfoDto 模板参数
     * @return 是否存在
     */
    private boolean checkTemplateName(SpuTemplateInfoDto spuTemplateInfoDto) {
        if (!StringUtils.hasText(spuTemplateInfoDto.getTemplateName())) {
            return false;
        }
        LambdaQueryWrapper<SpuTemplateInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SpuTemplateInfo::getTemplateName, spuTemplateInfoDto.getTemplateName());
        queryWrapper.eq(SpuTemplateInfo::getCategoryId, spuTemplateInfoDto.getCategoryId());
        queryWrapper.eq(SpuTemplateInfo::getDelFlag, 0);
        if (spuTemplateInfoDto.getId() != null) {
            queryWrapper.ne(SpuTemplateInfo::getId, spuTemplateInfoDto.getId());
        }
        return spuTemplateInfoMapper.selectCount(queryWrapper) > 0;
    }
}
